<!DOCTYPE html>

<html lang="zh-CN">
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="./index.css">
</head>

<body>
    <!-- 
    ！注意写上题目题数
    例如 ：
    1、选择题
        (1)D
        (2)C
        (3)true false false
        (4)B
        (5)C
        ...
    2、填空题
        (1)
        获取节点方法：
            getElement系列
                (1)getElementById 
                (2)getElementsByClassName
                (3)getElementsByTagName
                (4)getElementsByName
            querySelector系列
                (5)querySelector
                (6)querySelectorAll
        创建节点方法
            (1)createTextNode()
            (2)createElement()
        添加节点方法
            (1)node.appendChild(element)
            (2)node.append(element) 
        dom的其他操作方法
            node.remove() 删除自身节点
            node.removeChild(子节点)  删除子节点
            node.replaceChild(newNode, oldNode) 替换节点
            node.insertBefore(newElement, element) 插入节点

        (2)
        Object.prototype
        fn.prototype
        Function.prototype
        Function.prototype.__proto__
        Array.prototype
        Array.prototype.__proto__
        Function.prototype
        Array.prototype
        Object.prototype
        true.__proto__
        Function.__proto__.__proto__

    3. 描述题
        (1)
        ajax执行异步网络请求, 是一种创建动态网页技术
        是一种在无需刷新加载整个网页的情况下, 能够更新部分网页内容的技术
        (2)
        this指向Fn{}
        (3)
        主线程任务全部执行完之后，任务队列中的回调函数会再次回到调用栈中执行，俗称事件循环。
        (4)
        原型以及作用:
        我们创建的每个函数都有一个原型对象(prototype属性)
        这个属性是一个指针, 指向的是一个对象，这个对象包含了通过构造函数所创建的实例对象共享的属性和方法
        什么是原型链:
        实例对象和原型之间的连接, 叫做原型链
        
    4.逻辑题
        (1)Goodbye Jack
        (2)10
        (3)
        (4)667
        (5) Hy Jack
        (6) Jack HanMeiMei
            undefined
        (7)1

    
    5.实操题
    (1)
    ES5 
    ES6
     class Person {
            constructor(id, name) {
                this.id = id;
                this.name = name;
            }
            say() {
                console.log(this.name + " say Hi!");
            }
        };
    (2)
    // 使用Promise封装ajax
        function ajax(_url, _data, _method) {
            // GET请求为默认请求
            let method = _method || "GET";
            // GET请求就直接默认是null
            let data = _data || null;
            // 返回Prmoise对象
            return new Promise((resolve, reject) => {
                // 实例化一个XMLHttpRequest对象
                let xhr = new XMLHttpRequest();
                if (method.toUpperCase() == "GET") {
                    let str = "?";
                    // 处理get请求的参数
                    for (let k in data) {
                        str += `${k}=${data[k]}&`;
                    };
                    str = str.slice(0, -1);
                    xhr.open(method, _url + str);
                } else {
                    xhr.open(method, _url);
                }
                // 设置默认请求头
                // 设置请求头格式为json格式
                xhr.setRequestHeader("Content-Type", "application/json");
                xhr.send(JSON.stringify(data));

                xhr.addEventListener("readystatechange", () => {
                    if (xhr.readyState == 4) {
                        if (xhr.status == 200) {
                            // 返回解析成功结果
                            resolve(JSON.parse(xhr.responseText));
                        } else {
                            // 拒绝
                            reject(JSON.parse(xhr.responseText));
                        }
                    }
                })
            })
        };
    (3)
    let arr = [1, 2, 5, 2, 4, 5, 10, 2, 5, 1, 2, 4, 5, 8, 6, 4];
    1.
        let newArr1 = [];
        let newArr2 = [];
        for(let i = 0; i < arr.length; i++){
            if(arr.indexOf(arr[i]) != arr.lastIndexOf(arr[i])){
                if(newArr1.indexOf(arr[i]) == -1){
                    newArr1.push(arr[i]);
                }
            };
            if(arr.indexOf(arr[i]) == arr.lastIndexOf(arr[i])){
                if(newArr2.indexOf(arr[i]) == -1){
                    newArr2.push(arr[i]);
                }
            };
        };
        console.log(newArr1.concat(newArr2).sort());    // [1, 10, 2, 4, 5, 6, 8]
    2.
        function newArr(arr){
            for(let i=0;i<arr.length;i++){
                for(let j=i+1;j<arr.length;j++){
                    if(arr[i]==arr[j]){ 
                        //如果第一个等于第二个，splice方法删除第二个
                        arr.splice(j,1);
                        j--;
                    }
                };
            };
            return arr;
        };
        console.log(newArr(arr).sort());   // [1, 10, 2, 4, 5, 6, 8]
    3.
        function newArr(arr){ 
            //一个新的数组 
            let arrs = []; 
            //遍历当前数组 
            for(let i = 0; i < arr.length; i++){ 
                //如果临时数组里没有当前数组的当前值，则把当前值push到新数组里面 
                if (arrs.indexOf(arr[i]) == -1){ 
                    arrs.push(arr[i])
                }
            };
            return arrs; 
        };
        console.log(newArr(arr).sort());    // [1, 10, 2, 4, 5, 6, 8]
    4.
        function newArr(arr){
            return Array.from(new Set(arr))
        };
        console.log(newArr(arr).sort());    // [1, 10, 2, 4, 5, 6, 8]
    -->
</body>

</html>